package middleware

import (
	"fitness/go-admin/pkg/cache"
	"fitness/go-admin/pkg/errcode"
	"fitness/go-admin/pkg/response"
	"fmt"
	"time"

	"github.com/gin-gonic/gin"
)

// RateLimit 通用限流中间件
func RateLimit(maxRequests int64, window time.Duration) gin.HandlerFunc {
	return func(c *gin.Context) {
		// 如果Redis未连接，跳过限流
		if cache.RedisClient == nil {
			c.Next()
			return
		}

		// 获取客户端IP
		clientIP := c.ClientIP()
		key := fmt.Sprintf("ratelimit:%s:%s", c.FullPath(), clientIP)

		// 增加计数
		count, err := cache.IncrementRateLimit(key, window)
		if err != nil {
			// 限流失败不影响正常请求
			c.Next()
			return
		}

		// 检查是否超过限制
		if count > maxRequests {
			response.Error(c, errcode.TooManyRequests, "")
			c.Abort()
			return
		}

		c.Next()
	}
}

// LoginRateLimit 登录接口专用限流（5次/分钟）
func LoginRateLimit() gin.HandlerFunc {
	return RateLimit(5, 1*time.Minute)
}

// RegisterRateLimit 注册接口专用限流（3次/小时）
func RegisterRateLimit() gin.HandlerFunc {
	return RateLimit(3, 1*time.Hour)
}

// RefreshTokenRateLimit Token刷新限流（10次/分钟）
func RefreshTokenRateLimit() gin.HandlerFunc {
	return RateLimit(10, 1*time.Minute)
}
